// 第二版 (来自 underscore 的实现)
var memorize = function(func, hasher) {// 使用 function 的第一个参数作为 key
    var memoize = function(key) {// 自定义key 转换为json字符串的值
        var cache = memoize.cache;
        // 如果hasher这个函数存在就执行函数 不存在就返回key 
        var address = '' + (hasher ? hasher.apply(this, arguments) : key);
        if (!cache[address]) {// 如果不存在
            cache[address] = func.apply(this, arguments);// 就执行这个函数并存储
        }
        return cache[address];
    };
    memoize.cache = {};// 将函数的参数和对应的结果一并缓存至闭包中
    return memoize;
};
var add = function(a, b, c) {
    return a + b + c
  }
var memoizedAdd = memorize(add, function(){// hasher 函数，自定义存储的 key 值
    var args = Array.prototype.slice.call(arguments)// 指向拆分后的arguments
    // console.log(JSON.stringify(args));
    return JSON.stringify(args)// js对象 转换为json字符串后用作缓存的 key
})

console.log(memoizedAdd(1, 2, 3)) // 6
console.log(memoizedAdd(1, 2, 4)) // 7